package com.mini.grpc.server;

import com.mini.grpc.common.MethodDescriptor;
import com.mini.grpc.server.ServerInterceptor;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;

/**
 * 服务端构建器抽象类
 * 提供构建Mini-gRPC服务端的基础功能
 * 
 * @author Mini-gRPC
 */
public abstract class ServerBuilder<T extends ServerBuilder<T>> {
    
    /**
     * 为指定端口创建服务端构建器
     * 
     * @param port 监听端口
     * @return 服务端构建器实例
     */
    public static ServerBuilder<?> forPort(int port) {
        return new NettyServerBuilder(port);
    }
    
    /**
     * 添加服务定义
     * 
     * @param service 服务定义
     * @return 构建器实例
     */
    public abstract T addService(ServerServiceDefinition service);
    
    /**
     * 添加服务实现（通过绑定服务定义）
     * 
     * @param bindableService 可绑定的服务实现
     * @return 构建器实例
     */
    public abstract T addService(BindableService bindableService);
    
    /**
     * 设置执行器
     * 
     * @param executor 执行器
     * @return 构建器实例
     */
    public abstract T executor(Executor executor);
    
    /**
     * 添加拦截器
     * 
     * @param interceptor 服务端拦截器
     * @return 构建器实例
     */
    public abstract T intercept(ServerInterceptor interceptor);
    
    /**
     * 设置握手超时时间
     * 
     * @param timeout 超时时间
     * @param unit 时间单位
     * @return 构建器实例
     */
    public abstract T handshakeTimeout(long timeout, TimeUnit unit);
    
    /**
     * 设置最大入站消息大小
     * 
     * @param bytes 最大字节数
     * @return 构建器实例
     */
    public abstract T maxInboundMessageSize(int bytes);
    
    /**
     * 设置最大入站元数据大小
     * 
     * @param bytes 最大字节数
     * @return 构建器实例
     */
    public abstract T maxInboundMetadataSize(int bytes);
    
    /**
     * 构建服务端实例
     * 
     * @return 服务端实例
     */
    public abstract Server build();
    
    /**
     * 返回当前构建器实例（用于链式调用）
     * 
     * @return 构建器实例
     */
    @SuppressWarnings("unchecked")
    protected T thisT() {
        return (T) this;
    }
} 